package com.zhx.common.common.event.Listener;


import com.zhx.common.chat.domain.dto.ChatMsgRecallDTO;
import com.zhx.common.chat.service.cache.MsgCache;
import com.zhx.common.common.event.MessageRecallEvent;
import com.zhx.common.user.service.adapter.WSAdapter;
import com.zhx.common.user.service.impl.PushService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionalEventListener;

import javax.annotation.Resource;

/**
 * 消息撤回监听器
 */
@Slf4j
@Component
public class MessageRecallListener {
    @Resource
    private MsgCache msgCache;

    @Resource
    private PushService pushService;
    /**
     * 当接收到消息召回事件时，异步并事务性地从缓存中移除指定的消息。
     *
     * @param event 消息召回事件，包含召回消息的详细信息。
     *              该事件触发时，会尝试从缓存中移除对应的消息。
     */
    @Async
    @TransactionalEventListener(classes = MessageRecallEvent.class,fallbackExecution = true)
    public void evictMsg(MessageRecallEvent event){
        // 从事件中获取消息召回的详细信息
        ChatMsgRecallDTO recallDTO = event.getRecallDTO();
        // 从消息缓存中移除指定的消息
        msgCache.evictMsg(recallDTO.getMsgId());
    }

    /**
     * 异步处理消息召回事件，将召回消息发送给所有相关用户。
     * 使用@TransactionalEventListener注解监听MessageRecallEvent事件，
     * 如果事件处理过程中发生异常，会尝试再次执行（fallbackExecution = true）。
     *
     * @param event 消息召回事件，包含召回消息的详细信息。
     * @Async 注解表明此方法应该异步执行，不等待方法完成。
     */
    @Async
    @TransactionalEventListener(classes = MessageRecallEvent.class,fallbackExecution = true)
    public void sendToAll(MessageRecallEvent event){
        // 使用推送服务将召回消息发送给所有相关用户
        pushService.sendPushMsg(WSAdapter.buildMsgRecall(event.getRecallDTO()));
    }
}
